# app/utils/template_prompt_helper.py
from typing import Optional, Dict, Any
from app.schemas.video_schemas import TemplateScenarioType, VideoGenerateRequest

# 融合Prompt模板配置
FUSION_PROMPT_TEMPLATES = {
    TemplateScenarioType.FACE_SWAP: {
        "prompt": "将模板图片中的人物面部特征替换为用户图片中的人物面部，保持原有发型、服装、姿态和背景环境完全不变，确保面部融合自然真实",
        "scale": 0.7,
        "keywords": ["真实", "自然融合", "细节保持"]
    },
    TemplateScenarioType.BACKGROUND_REPLACE: {
        "prompt": "将用户图片中的人物完整地移植到模板背景环境中，保持人物的所有特征、服装、姿态不变，确保人物与新背景的光影、色调协调一致",
        "scale": 0.6,
        "keywords": ["环境融入", "光影协调", "自然过渡"]
    },
    TemplateScenarioType.STYLE_TRANSFER: {
        "prompt": "将用户图片转换为模板图片的艺术风格，保持用户图片的主体内容、构图和基本特征，完全采用模板的艺术表现手法",
        "scale": 0.8,
        "keywords": ["风格统一", "艺术表现", "创意效果"]
    },
    TemplateScenarioType.PRODUCT_PLACEMENT: {
        "prompt": "将用户的产品图片自然地融入到模板营销场景中，调整产品的大小、角度、位置使其完美契合场景构图，保持产品特征清晰可见",
        "scale": 0.5,
        "keywords": ["产品突出", "场景协调", "营销效果"]
    },
    TemplateScenarioType.CHARACTER_COSPLAY: {
        "prompt": "将用户图片中的人物转换为模板角色的造型，替换服装、发型、配饰为角色特征，保持用户的面部特征，融合角色的经典pose和背景",
        "scale": 0.75,
        "keywords": ["角色还原", "造型精准", "神韵相似"]
    },
    TemplateScenarioType.ENVIRONMENT_BLEND: {
        "prompt": "将用户图片与模板环境进行深度融合，调整用户内容的光影、色调、材质以匹配模板环境的视觉特征，创造统一和谐的画面效果",
        "scale": 0.65,
        "keywords": ["环境统一", "沉浸体验", "视觉协调"]
    }
}

# 视频生成Prompt模板
VIDEO_PROMPT_TEMPLATES = {
    TemplateScenarioType.FACE_SWAP: "让这个人物自然地{动作描述}，保持面部表情生动，动作流畅自然",
    TemplateScenarioType.BACKGROUND_REPLACE: "在这个{环境描述}中，让人物{动作描述}，营造身临其境的感觉",
    TemplateScenarioType.STYLE_TRANSFER: "以{风格类型}的表现形式，让画面{动画效果}，展现独特的艺术魅力",
    TemplateScenarioType.PRODUCT_PLACEMENT: "突出展示{产品特点}，通过{展示方式}来吸引观众注意力",
    TemplateScenarioType.CHARACTER_COSPLAY: "以{角色名称}的经典动作和表情，展现{角色特点}的魅力",
    TemplateScenarioType.ENVIRONMENT_BLEND: "在这个{环境类型}中，营造{氛围描述}的沉浸感体验"
}

# 动作类型映射
MOTION_TYPE_MAPPING = {
    "natural": "自然摆动和微表情变化",
    "dynamic": "动态姿态变化和场景互动",
    "elegant": "优雅缓慢的动作流转",
    "energetic": "活力充沛的动作表现",
    "cinematic": "电影级镜头运动效果"
}

def generate_fusion_prompt(
    scenario_type: TemplateScenarioType,
    custom_prompt: Optional[str] = None,
    template_metadata: Optional[Dict[str, Any]] = None,
    user_metadata: Optional[Dict[str, Any]] = None
) -> str:
    """生成图片融合Prompt"""
    
    template_config = FUSION_PROMPT_TEMPLATES.get(scenario_type)
    if not template_config:
        return custom_prompt or "将用户图片与模板图片进行智能融合"
    
    base_prompt = template_config["prompt"]
    
    # 动态填充模板上下文
    if template_metadata:
        base_prompt = _inject_template_context(base_prompt, template_metadata)
    
    # 动态填充用户上下文
    if user_metadata:
        base_prompt = _inject_user_context(base_prompt, user_metadata)
    
    # 融合自定义Prompt
    if custom_prompt and "融合" not in custom_prompt.lower():
        base_prompt += f"。用户补充要求：{custom_prompt}"
    
    # 添加质量关键词
    quality_keywords = template_config.get("keywords", [])
    if quality_keywords:
        base_prompt += f"，重点关注：{', '.join(quality_keywords)}"
    
    return base_prompt

def generate_video_prompt(
    scenario_type: TemplateScenarioType,
    motion_type: str = "natural",
    custom_elements: Optional[Dict[str, Any]] = None,
    user_prompt: Optional[str] = None
) -> str:
    """生成视频Prompt"""
    
    template_prompt = VIDEO_PROMPT_TEMPLATES.get(scenario_type)
    if not template_prompt:
        return user_prompt or "让这张图片动起来，添加自然的动态效果"
    
    # 获取动作描述
    motion_desc = MOTION_TYPE_MAPPING.get(motion_type, MOTION_TYPE_MAPPING["natural"])
    
    # 根据场景类型填充不同的参数
    if scenario_type == TemplateScenarioType.FACE_SWAP:
        filled_prompt = template_prompt.format(动作描述=motion_desc)
    elif scenario_type == TemplateScenarioType.BACKGROUND_REPLACE:
        env_desc = custom_elements.get("environment", "美丽环境") if custom_elements else "美丽环境"
        filled_prompt = template_prompt.format(环境描述=env_desc, 动作描述=motion_desc)
    elif scenario_type == TemplateScenarioType.STYLE_TRANSFER:
        style_type = custom_elements.get("style", "艺术风格") if custom_elements else "艺术风格"
        animation_effect = custom_elements.get("animation", "动态变化") if custom_elements else "动态变化"
        filled_prompt = template_prompt.format(风格类型=style_type, 动画效果=animation_effect)
    elif scenario_type == TemplateScenarioType.PRODUCT_PLACEMENT:
        product_feature = custom_elements.get("product_feature", "产品特色") if custom_elements else "产品特色"
        display_method = custom_elements.get("display_method", "精美展示") if custom_elements else "精美展示"
        filled_prompt = template_prompt.format(产品特点=product_feature, 展示方式=display_method)
    elif scenario_type == TemplateScenarioType.CHARACTER_COSPLAY:
        character_name = custom_elements.get("character", "角色") if custom_elements else "角色"
        character_trait = custom_elements.get("trait", "独特魅力") if custom_elements else "独特魅力"
        filled_prompt = template_prompt.format(角色名称=character_name, 角色特点=character_trait)
    elif scenario_type == TemplateScenarioType.ENVIRONMENT_BLEND:
        env_type = custom_elements.get("environment_type", "特殊环境") if custom_elements else "特殊环境"
        atmosphere = custom_elements.get("atmosphere", "神秘氛围") if custom_elements else "神秘氛围"
        filled_prompt = template_prompt.format(环境类型=env_type, 氛围描述=atmosphere)
    else:
        filled_prompt = template_prompt.format(动作描述=motion_desc)
    
    # 融合用户自定义prompt
    if user_prompt:
        filled_prompt += f"。{user_prompt}"
    
    return filled_prompt

def get_fusion_strength(scenario_type: TemplateScenarioType) -> float:
    """获取场景推荐的融合强度"""
    template_config = FUSION_PROMPT_TEMPLATES.get(scenario_type, {})
    return template_config.get("scale", 0.6)

def _inject_template_context(prompt: str, template_metadata: Dict[str, Any]) -> str:
    """注入模板上下文信息"""
    # 可以根据模板元数据调整prompt
    if template_metadata.get("style"):
        style = template_metadata["style"]
        prompt = prompt.replace("艺术表现手法", f"{style}艺术表现手法")
    
    if template_metadata.get("environment"):
        environment = template_metadata["environment"]
        prompt = prompt.replace("背景环境", f"{environment}背景环境")
    
    return prompt

def _inject_user_context(prompt: str, user_metadata: Dict[str, Any]) -> str:
    """注入用户上下文信息"""
    # 可以根据用户图片元数据调整prompt
    if user_metadata.get("person_count"):
        count = user_metadata["person_count"]
        if count > 1:
            prompt = prompt.replace("人物", "多个人物")
    
    return prompt

# 便捷函数
def create_smart_fusion_prompts(request: VideoGenerateRequest) -> Dict[str, str]:
    """为智能融合请求创建所有需要的Prompt"""
    if not request.scenario_type:
        return {
            "fusion_prompt": request.prompt,
            "video_prompt": request.prompt
        }
    
    # 生成融合prompt
    fusion_prompt = generate_fusion_prompt(
        scenario_type=request.scenario_type,
        custom_prompt=request.prompt
    )
    
    # 生成视频prompt
    video_motion = "natural"  # 可以从request中获取更多参数
    video_prompt = generate_video_prompt(
        scenario_type=request.scenario_type,
        motion_type=video_motion,
        user_prompt=request.prompt
    )
    
    return {
        "fusion_prompt": fusion_prompt,
        "video_prompt": video_prompt,
        "recommended_fusion_strength": get_fusion_strength(request.scenario_type)
    }